\chapter{分组密码（block ciphers）}
分组密码就是将数据序列划分为一定长度的组，然后在密钥的控制下，将数据分组变换为等长数据序列或者组。\par
1949年香浓(C.D. Shannon)在其论文《保密系统的通信理论》中提到密码设计的基本方法，扩散(Diffusion)、混淆(Confusion)和乘积迭代。
\section{DES}
DES是Data Encryption Standard的所需，中文翻译为“数据加密标准”，其明文分组长度为64比特，密钥长为56比特。\par
\subsection{初始置换IP}
初始置换输入是64bit，输出也是64bit，初始置换表中元素表示64bit中的第几个，原始顺序是$1,2,3,\ldots,63,64$，置换表就是调换后的顺序，其顺序是由左至右，由上到下。逆初始置换表也是同样的含义。
\subsection{置换选择1}
此置换输入56bit，输出56bit，表的含义同初始置换表。
\subsection{置换选择2}
此置换输入56bit，输出48bit，表的含义同初始置换表，只是舍掉了8位，舍掉的为54，43，38，35，25，22，18，9。
\subsection{密钥左循环移位}
在每一轮的加密中，会将56bit密钥分为左右两半，分别对左右两半进行左循环移位，移动几位和第几轮加密有关，其对应关系有一个表。
\subsection{轮结构}
轮结构中有两个置换E和P，E置换输入32bit，输出48bit，是将其中一些位重复，并进行重排，利用扩展表形式表示。P置换输入32bit，输出32bit，只是将比特位进行了重排。\par
S盒是DES中重要的设计部分，S盒输入6bit，输出4bit。对于一个S盒的6bit输入，第一位和第六位，用来选择S盒中的一种代换方法，所以一个S盒共定义了四种代换方法，输入的另外4bit，用来确定其输出数据，我们从S定义表中的输出数据区可以看到，输出的最大数据为15，最小为0，这与输出是个4bit数据相符。
\subsection{解密}
解密算法和加密算法一样，只不过解密时的子密钥顺序与加密想反，也就是解密时，第一次迭代用的是加密时第十六次迭代的子密钥$k_16$,依次类推。
\section{2DES}
我们将密钥为k的DES加密用$c=E_k(m)$来表示，那么二重DES加密可写为$c=E_{k_2}(E_{k_1}(m)),k_1 \neq k_2$,所以2DES的密钥长度为$56 \times 2=112$bit.

\section{填充}
\subsection{NoPadding} 
这种方法，API或算法本身不对数据进行处理，加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密，可以补充\\0或者空格，然后trim。

\subsection{PKCS5Padding} 
加密时，先把数据字节长度对8取余，余数为m，若m>0,则补足8-m个字节，字节数值为8-m，即差几个字节就补几个字节，字节数值即为补充的字节数，若为0则补充8个字节的8。
解密后时，取最后一个字节，值为m，则从数据尾部删除m个字节，剩余数据即为加密前的原文。

\subsection{ISO 10126 padding}
ISO 10126  specifies that the padding should be done at the end of that last block with random bytes, and the padding boundary should be specified by the last byte.

Example: In the following example the block size is 8 bytes and padding is required for 4 bytes\\

... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |

\subsection{Zero padding}

All the bytes that are required to be padded are padded with zero. The zero padding scheme has not been standardized for encryption, although it is specified for hashes and MACs as Padding Method 1 in ISO/IEC 10118-1 and ISO/IEC 9797-1.\par

Example: In the following example the block size is 8 bytes and padding is required for 4 bytes\\

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 | \\
Zero padding may not be reversible if the original file ends with one or more zero bytes, making it impossible to distinguish between plaintext data bytes and padding bytes. It may be used when the length of the message can be derived out-of-band. It is often applied to binary encoded strings as the null character can usually be stripped off as whitespace.\par

Zero padding is sometimes also referred to as "null padding" or "zero byte padding". Some implementations may add an additional block of zero bytes if the plaintext is already divisible by the block size.

\section{分组密码的运行模式}

\subsection{电码本模式(Electronic Code Book)/ECB模式}
首先对明文进行分组，最后一个分组不够64bit需要进行填充。每个明文组独立地用同一密钥加密。$M={m_1,m_2,m_3,\ldots},C={E_k(m_1),E_k(m_2),E_k(m_3),\ldots}$.
\subsection{密码分组链接模式(Cipher Block Chain)/CBC模式}
首先对明文进行分组，最后一个分组不够64bit需要进行填充。加密算法输入时当前明文组与前一个密文组的异或。$c_i=E_k(c_{i-1}\oplus m_i),c_0=IV$，IV为一个初始值。
\subsection{密码反馈模式(Cipher Feedback)/CFB模式}
CFB模式将DES转换为流密码进行加密，所以不要进行填充，而且可以实时运行。CFB模式每次加密单元为j比特($j \leq 64$),$S_j(X)$表示去X的高j位,$A \parallel B$表示将A和B按照高低位进行拼接，比如$11110000 \parallel 10100101= 1111000010100101=(F0A5)_{16}$,$SL_j(X)$表示去X的低j位，$E_k$表示密钥为k的DES加密算法，CFB模式可以表示为，$c_1=p_1 \oplus S_j(E_k(L_{64}(IV))),c_i=p_i \oplus S_j(E_k(L_{64}(IV \parallel c_1 \parallel \ldots \parallel c_{i-1}))),i \geq 2$,IV是一个64bit初始向量。
\subsection{输出反馈模式(Output Feedback)/OFB模式}
OFB模式也是转换为流模式处理，但是其流密钥生成独立与密文。$r_i$看成流加密的密钥，OFB加密过程可以写成$c_i=p_i \oplus r_i,i=1,2,\ldots$,密钥流为：
\begin{equation}
	\begin{cases}
	  r_1=S_j(E_k(IV))\\
	  r_2=S_j(E_k(L_{64}(IV \parallel r_1)))\\
	  r_3=S_j(E_k(L_{64}(IV \parallel r_1 \parallel r_2)))\\
	  r_4=S_j(E_k(L_{64}(IV \parallel r_1 \parallel r_2 \parallel r_3)))\\
	  \ldots
	\end{cases}
\end{equation}
